home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / DB / DataObject / Cast.php next >
PHP Script  |  2004-10-01  |  9KB  |  341 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2002 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors:  Alan Knowles <alan@akbkhome.com>                           |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: Cast.php,v 1.6 2004/06/05 02:32:34 alan_k Exp $
  20. //
  21. //  Prototype Castable Object.. for DataObject queries
  22. //
  23.  
  24. /**
  25. *  
  26. * @abstract Storage for Data that may be cast into a variety of formats.
  27. * Common usages:
  28. *   // blobs
  29. *   $data = DB_DataObject_Cast::blob($somefile);
  30. *   $data = DB_DataObject_Cast::string($somefile);
  31. *   $dataObject->someblobfield = $data
  32. *
  33. *   // dates?
  34. *   $d1 = new DB_DataObject_Cast::date('12/12/2000');
  35. *   $d2 = new DB_DataObject_Cast::date(2000,12,30);
  36. *   $d3 = new DB_DataObject_Cast::date($d1->year, $d1->month+30, $d1->day+30);
  37. *   
  38. *   // time, datetime.. ?????????
  39. *
  40. *   // raw sql????
  41. *    $data = DB_DataObject_Cast::sql('cast("123123",datetime)');
  42. *    $data = DB_DataObject_Cast::sql('NULL');
  43. *
  44. *   // int's/string etc. are proably pretty pointless..!!!!
  45. *
  46. *   
  47. *   inside DB_DataObject, 
  48. *   if (is_a($v,'db_dataobject_class')) {
  49. *           $value .= $v->toString(DB_DATAOBJECT_INT,'mysql');
  50. *   }
  51. *
  52. *
  53. *
  54. *
  55. * @version    $Id: Cast.php,v 1.6 2004/06/05 02:32:34 alan_k Exp $
  56. */ 
  57. class DB_DataObject_Cast {
  58.         
  59.     /**
  60.     * Type of data Stored in the object..
  61.     *
  62.     * @var string       (date|blob|.....?)
  63.     * @access public        
  64.     */
  65.     var $type;
  66.         
  67.     /**
  68.     * Data For date representation
  69.     *
  70.     * @var int  day/month/year
  71.     * @access public
  72.     */
  73.     var $day;
  74.     var $month;
  75.     var $year;
  76.  
  77.     
  78.     /**
  79.     * Generic Data..
  80.     *
  81.     * @var string
  82.     * @access public
  83.     */
  84.  
  85.     var $value;
  86.  
  87.  
  88.  
  89.     /**
  90.     * Blob consructor
  91.     *
  92.     * create a Cast object from some raw data.. (binary)
  93.     * 
  94.     * 
  95.     * @param   string (with binary data!)
  96.     *
  97.     * @return   object DB_DataObject_Cast
  98.     * @access   public 
  99.     */
  100.   
  101.     function blob($value) {
  102.         $r = new DB_DataObject_Cast;
  103.         $r->type = 'blob';
  104.         $r->value = $value;
  105.         return $r;
  106.     }
  107.  
  108.  
  109.     /**
  110.     * String consructor (actually use if for ints and everything else!!!
  111.     *
  112.     * create a Cast object from some string (not binary)
  113.     * 
  114.     * 
  115.     * @param   string (with binary data!)
  116.     *
  117.     * @return   object DB_DataObject_Cast
  118.     * @access   public 
  119.     */
  120.   
  121.     function string($value) {
  122.         $r = new DB_DataObject_Cast;
  123.         $r->type = 'string';
  124.         $r->value = $value;
  125.         return $r;
  126.     }
  127.     
  128.     /**
  129.     * SQL constructor (for raw SQL insert)
  130.     *
  131.     * create a Cast object from some sql
  132.     * 
  133.     * @param   string (with binary data!)
  134.     *
  135.     * @return   object DB_DataObject_Cast
  136.     * @access   public 
  137.     */
  138.   
  139.     function sql($value) {
  140.         $r = new DB_DataObject_Cast;
  141.         $r->type = 'sql';
  142.         $r->value = $value;
  143.         return $r;
  144.     }
  145.  
  146.  
  147.     /**
  148.     * Date Constructor
  149.     *
  150.     * create a Cast object from some string (not binary)
  151.     * 
  152.     * 
  153.     * @param   vargs... accepts
  154.     *       dd/mm
  155.     *       dd/mm/yyyy
  156.     *       yyyy-mm
  157.     *       yyyy-mm-dd
  158.     *       array(yyyy,dd)
  159.     *       array(yyyy,dd,mm)
  160.     *
  161.     *
  162.     *
  163.     * @return   object DB_DataObject_Cast
  164.     * @access   public 
  165.     */
  166.   
  167.     function date() {  
  168.         $args = func_get_args();
  169.         switch(count($args)) {
  170.             case 0: // no args = today!
  171.                $bits =  explode('-',date('Y-m-d'));
  172.                 break;
  173.             case 1: // one arg = a string 
  174.             
  175.                 if (strpos($args[0],'/') !== false) {
  176.                     $bits = array_reverse(explode('/',$args[0]));
  177.                 } else {
  178.                     $bits = explode('-',$args[0]);
  179.                 }
  180.             default: // 2 or more..
  181.                 $bits = $args;
  182.         }
  183.         if (count($bits) == 1) { // if YYYY set day = 1st..
  184.             $bits[] = 1;
  185.         }
  186.         
  187.         if (count($bits) == 2) { // if YYYY-DD set day = 1st..
  188.             $bits[] = 1;
  189.         }
  190.         
  191.         // if year < 1970 we cant use system tools to check it...
  192.         // so we make a few best gueses....
  193.         // basically do date calculations for the year 2000!!!
  194.         // fix me if anyone has more time...
  195.         if (($bits[0] < 1975) || ($bits[0] > 2030)) {
  196.             $oldyear = $bits[0];
  197.             $bits = explode('-',date('Y-m-d',mktime(1,1,1,$bits[1],$bits[2],2000)));
  198.             $bits[0] = ($bits[0] - 2000) + $oldyear;
  199.         } else {
  200.             // now mktime
  201.             $bits = explode('-',date('Y-m-d',mktime(1,1,1,$bits[1],$bits[2],$bits[0])));
  202.         }
  203.         $r = new DB_DataObject_Cast;
  204.         $r->type = 'date';
  205.         list($r->year,$r->month,$r->day) = $bits;
  206.         return $r;
  207.     }
  208.     
  209.     /**
  210.     * get the string to use in the SQL statement for this...
  211.     *
  212.     * 
  213.     * @param   int      $to Type (DB_DATAOBJECT_*
  214.     * @param   string  $db    (eg. mysql|mssql.....)
  215.     * 
  216.     *
  217.     * @return   string 
  218.     * @access   public
  219.     */
  220.   
  221.     function toString($to=false,$db='mysql') {
  222.         // if $this->type is not set, we are in serious trouble!!!!
  223.         // values for to:
  224.         $method = 'toStringFrom'.$this->type;
  225.         return $this->$method($to,$db);
  226.     }
  227.     
  228.     /**
  229.     * get the string to use in the SQL statement from a blob of binary data 
  230.     *   ** Suppots only blob->postgres::bytea
  231.     *
  232.     * @param   int      $to Type (DB_DATAOBJECT_*
  233.     * @param   string  $db    (eg. mysql|mssql.....)
  234.     * 
  235.     *
  236.     * @return   string 
  237.     * @access   public
  238.     */
  239.     function toStringFromBlob($to,$db) {
  240.         // first weed out invalid casts..
  241.         // in blobs can only be cast to blobs.!
  242.         
  243.         // perhaps we should support TEXT fields???
  244.         
  245.         if (!($to & DB_DATAOBJECT_BLOB)) {
  246.             return PEAR::raiseError('Invalid Cast from a DB_DataObject_Cast::blob to something other than a blob!');
  247.         }
  248.         
  249.         switch ($db) {
  250.             case 'pgsql':
  251.                 return "'".pg_escape_bytea($this->value)."'::bytea";
  252.             
  253.             default:
  254.                 return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:$db Yet");
  255.         }
  256.     
  257.     }
  258.     
  259.     /**
  260.     * get the string to use in the SQL statement for a blob from a string!
  261.     *   ** Suppots only string->postgres::bytea
  262.     * 
  263.     *
  264.     * @param   int      $to Type (DB_DATAOBJECT_*
  265.     * @param   string  $db    (eg. mysql|mssql.....)
  266.     * 
  267.     *
  268.     * @return   string 
  269.     * @access   public
  270.     */
  271.     function toStringFromString($to,$db) {
  272.         // first weed out invalid casts..
  273.         // in blobs can only be cast to blobs.!
  274.         
  275.         // perhaps we should support TEXT fields???
  276.         // 
  277.         
  278.         if (!($to & DB_DATAOBJECT_BLOB)) {
  279.             return PEAR::raiseError('Invalid Cast from a DB_DataObject_Cast::string to something other than a blob!'.
  280.                 ' (why not just use native features)');
  281.         }
  282.         
  283.         switch ($db) {
  284.             case 'pgsql':
  285.                 return "'".pg_escape_string($this->value)."'::bytea";
  286.             
  287.             default:
  288.                 return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:$db Yet");
  289.         }
  290.     
  291.     }
  292.     
  293.     
  294.     /**
  295.     * get the string to use in the SQL statement for a date
  296.     *   
  297.     * 
  298.     *
  299.     * @param   int      $to Type (DB_DATAOBJECT_*
  300.     * @param   string  $db    (eg. mysql|mssql.....)
  301.     * 
  302.     *
  303.     * @return   string 
  304.     * @access   public
  305.     */
  306.     function toStringFromDate($to,$db) {
  307.         // first weed out invalid casts..
  308.         // in blobs can only be cast to blobs.!
  309.          // perhaps we should support TEXT fields???
  310.         // 
  311.         
  312.         if (($to !== false) && !($to & DB_DATAOBJECT_DATE)) {
  313.             return PEAR::raiseError('Invalid Cast from a DB_DataObject_Cast::string to something other than a date!'.
  314.                 ' (why not just use native features)');
  315.         }
  316.         return "'{$this->year}-{$this->month}-{$this->day}'";
  317.     }
  318.     
  319.    
  320.     
  321.     /**
  322.     * get the string to use in the SQL statement for a raw sql statement.
  323.     *
  324.     * @param   int      $to Type (DB_DATAOBJECT_*
  325.     * @param   string  $db    (eg. mysql|mssql.....)
  326.     * 
  327.     *
  328.     * @return   string 
  329.     * @access   public
  330.     */
  331.     function toStringFromSql($to,$db) {
  332.         return $this->value; 
  333.     }
  334.     
  335.     
  336.     
  337.     
  338. }
  339.  
  340.